package com.zxl.yunpicture.infrastructure.api.imageSearch.sub;


import cn.hutool.core.util.URLUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONUtil;
import com.zxl.yunpicture.infrastructure.exception.BusinessException;
import com.zxl.yunpicture.infrastructure.exception.ErrorCode;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;


/**
 * 获取图片页面地址
 * 梳理流程：
 * 通过调用百度的以图搜图接口，使用自己的图片，完成以图搜图结果链接的返回
 * 首先使用本地浏览器向百度的以图搜图发请求，查看百度以图搜图的请求格式
 * 自己构建出这个格式
 * 拼接url 和 uptime
 * 构建好url之后，就要发送post请求
 * 拼接form、header的Acs-Token参数之后
 * 拿到返回的response
 * 判断状态码无误后
 * 拿到body返回体
 * 使用hutool工具类将字节数组转换为对象
 * 使用hutool工具类 解析响应 将json键值对转化为map对象
 * 这里存的就是传统的 data msg status
 * 校验相应的状态码
 * 无误后拿到map对象的data数据
 * 再从data数据中拿到rawUrl数据
 * 对rawUrl进行utf8解码后 得到以图搜图返回的链接地址
 *
 */
@Slf4j
public class GetImagePageUrlApi {


    /**
     * 获取图片页面地址
     * step1
     * @param imageUrl
     * @return
     */
    public static String getImagePageUrl(String imageUrl){
        // 1. 准备请求参数
        Map<String, Object> formData = new HashMap<>();
        formData.put("image", imageUrl);
        formData.put("tn", "pc");
        formData.put("from", "pc");
        formData.put("image_source", "PC_UPLOAD_URL");
        // 获取当前时间戳
        long uptime = System.currentTimeMillis();
        // 请求地址
        String url = "https://graph.baidu.com/upload?uptime=" + uptime;
        String acsToken = "1740717080393_1740744444011_NMJFBsxKtFIHlDboqrP4BAZNGw8X+ac0m1eFukKVRoZNvbATcpk6LDsxvXli298GLckTMQ89QUGlFKirwYpzMCBjEDHU0PUC5PvpU1GBeSnAeXyOYkPCpTOoQTCHiJpsoXqkKnPKYruphQgmDwEfItLV2Wf5xWJbQu/fJgs+QrvEH6DHaI9sb2RggHcfR5qXFdP6ji0tIg/v2CLnQNF0Q9YRHrr6Dk67peRtGDWyyOQfrVk0arPw4gJjYrhROobMknjtD59Xl/+9CAVKJzrTSkDp9/1PppnJLaPz3zpE599GfgKCyhOvaCq2hsaso/YCjAG4w0n49zlriHso/ViC1tk5hpoOA6E80lsCmk1cmUKcDy437aaMQDpwo+8WyZk2RkpMACCv9TJwV/rGrZr9mECiGmUk8GTWzMzg8MPMeVU93Ujeq66d/jGjrHLSYezhCKp+buKZQpirqqc3aTStpZMB+/dcqzskNxG/co+BLDA=";

        try {
            //发送post请求到百度接口
            HttpResponse response = HttpRequest.
                    post(url).
                    form(formData).
                    header("Acs-Token",acsToken).
                    timeout(5000).
                    execute();
            //判断响应状态
            if (HttpStatus.HTTP_OK != response.getStatus()){
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "接口调用失败");
            }
            //解析响应
            String responseBody = response.body();
            Map<String,Object> result = JSONUtil.toBean(responseBody, Map.class);

            //处理响应结果
            if (result == null || !Integer.valueOf(0).equals(result.get("status"))){
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "接口调用失败");
            }
            Map<String, Object> data = (Map<String, Object>) result.get("data");
            String rawUrl = (String) data.get("url");
            // 对 URL 进行解码
            String searchResultUrl = URLUtil.decode(rawUrl, StandardCharsets.UTF_8);
            //如果url为空
            if (searchResultUrl == null){
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "未返回有效结果");
            }
            return searchResultUrl;
        }catch (Exception e){
            log.error("搜索失败",e);
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "搜索失败");
        }
    }
    public static void main(String[] args) {
        // 测试以图搜图功能
        String imageUrl = "https://zhangxl-1311388563.cos.ap-nanjing.myqcloud.com//public/1884608016010637313/2025-02-10_wKPDwc8Ji0Uphw9Y.";
        String result = getImagePageUrl(imageUrl);
        System.out.println("搜索成功，结果 URL：" + result);
    }
}
